package servidor;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;



public class Servidor4 {
static final int PUERTO=4999; //puerto en el cual escucho a los clientes
	
	ArrayList<Socket> listaClientes;
	int x,y;
	
	
	public Servidor4(){
		System.out.println("Escucho en el puerto :"+PUERTO);
		listaClientes = new ArrayList<Socket>();
		x=0;
		y=0;
		
		try {
			//Creo un socket que escucha a los clientes en  PUERTO
			ServerSocket skServidor = new ServerSocket( PUERTO );
			//se crea un ciclo permanente para escuchar a todos los clientes que lleguen
			while(true){
				//se crea un socket por cada cliente que llegue y se crea un hilo que lo atienda
				Socket skCliente = skServidor.accept();
				//agrego el nuevo cliente la lista de clientes
				listaClientes.add(skCliente);
				Runnable nuevoCliente = new HiloAtiendeCliente(skCliente);
				Thread hilo = new Thread(nuevoCliente);
				hilo.start();	
				System.out.println("LLEGO UN CLIENTE");
			}
	
		} 
		catch( Exception e ) {
	
			System.out.println( e.getMessage() );
	
		}
		
		
	}
	
	
	private class HiloAtiendeCliente implements Runnable{
		
		DataInputStream flujoEntrada; 
		DataOutputStream flujoSalida;
		Socket socket;
		public HiloAtiendeCliente(Socket socket){
			
			try {
				this.socket=socket;
				InputStream aux = socket.getInputStream();
				//genera el flujo de entrada, por aca RECIBO los mensajes que vienen de este cliente
				flujoEntrada = new DataInputStream( aux );
				OutputStream aux1 = socket.getOutputStream();
				flujoSalida =  new DataOutputStream(aux1);
				//le envio el id de cliente que esta eperando
				flujoSalida.writeUTF(""+(listaClientes.size()-1));
				
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			
			
			
		}
		@Override
		public void run() {
			int idCliente;
			//creo un lazo que esta continuamente esperando mensajes del cliente al que atiende
			while(true){
				try {
					System.out.println("Espero Coordenadas x,y");
					//asumo que los mensajes se envian en este orden, primero x y luego y
					idCliente=Integer.parseInt(flujoEntrada.readUTF());
					x=Integer.parseInt(flujoEntrada.readUTF());
					y=Integer.parseInt(flujoEntrada.readUTF());
					//System.out.println("SERVIDOR: X: "+x+" Y: "+y);
					//despues de recibir una actualizacion , actualizo a todos los demas clientes
					actualizarClientes(idCliente);
					
				} catch (NumberFormatException | IOException e) {
					e.printStackTrace();
					try {
						socket.close();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					break;
				}
			}
			
		}
	}
	
	private void actualizarClientes(int idMensaje) {
		Iterator i = listaClientes.iterator();
		Socket socket;
		DataOutputStream flujoSalida;
		//recorro toda la lista actualizando a los clientes con la nueva informacion
		while(i.hasNext()){
			socket = (Socket)i.next();
			if (!socket.isClosed()){
				try {
						System.out.println("actualizo clientes ");				
						//hago los preparativos para enviar el mensaje
						
						OutputStream aux = socket.getOutputStream();
						flujoSalida= new DataOutputStream( aux );
						
						//envio el mensaje , primero x y luego y
						flujoSalida.writeUTF(""+idMensaje);
						flujoSalida.writeUTF(""+x);
						flujoSalida.writeUTF(""+y);
						
	
				
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
	}
	public static void main(String[] args) {
		new Servidor4();

	}

}


